home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cdity / ModeProSrc.lha / Daemon / BackdropColor.c < prev    next >
C/C++ Source or Header  |  1998-10-11  |  3KB  |  94 lines

  1. #define DEBUG
  2. #include <debug.h>
  3.  
  4. #include "backfill.h"
  5. #include "mp.h"
  6. #include <proto/cybergraphics.h>
  7. #include <graphics/gfx.h>
  8.  
  9. extern BOOL    V39;
  10.  
  11. static void __saveds __asm RGB_BackfillFunc(register __a0 struct RGB_BackfillHook *BF,register __a2 struct RastPort *RP,register __a1 struct BackFillMsg *BFM);
  12. static void __saveds __asm RGB_CyberGfxBackfillFunc(register __a0 struct RGB_BackfillHook *BF,register __a2 struct RastPort *RP,register __a1 struct BackFillMsg *BFM);
  13.  
  14. struct RGB_BackfillHook
  15. {
  16.   struct Hook rgb_Hook;
  17.   struct Screen *rgb_Screen;
  18.   BOOL   rgb_UseCyberGfx;
  19.   LONG   rgb_Pen;
  20. };
  21.  
  22. struct Hook *RGB_AllocBackfillHook(struct Screen *Scr, struct DefaultNode *DN)
  23. {
  24.   struct RGB_BackfillHook *b;
  25.   
  26.   if(V39)
  27.   {
  28.     if(b=AllocVec(sizeof(*b),MEMF_CLEAR|MEMF_PUBLIC))
  29.     {
  30.       if(GetBitMapAttr(Scr->RastPort.BitMap,BMA_DEPTH) >8 )
  31.       {
  32.         if(CyberGfxBase)
  33.         {
  34.           /* Since it is >8 bits */
  35.           b->rgb_UseCyberGfx=IsCyberModeID( GetVPModeID(&Scr->ViewPort) );
  36.         }
  37.       }
  38.       
  39.       if(b->rgb_UseCyberGfx)
  40.       {
  41.         b->rgb_Pen=(DN->BackdropRGB.Red   & 0xff000000)>>8  |
  42.                    (DN->BackdropRGB.Green & 0xff000000)>>16 |                   
  43.                    (DN->BackdropRGB.Blue  & 0xff000000)>>24;
  44.         b->rgb_Hook.h_Entry = (ULONG (*)())RGB_CyberGfxBackfillFunc;
  45.         return((struct Hook *)b);
  46.       }
  47.       else
  48.       {
  49.         if(-1!=(b->rgb_Pen=ObtainBestPen(Scr->ViewPort.ColorMap,DN->BackdropRGB.Red,DN->BackdropRGB.Green,DN->BackdropRGB.Blue,0)))
  50.         {
  51.           b->rgb_Screen=Scr;
  52.           b->rgb_Hook.h_Entry = (ULONG (*)())RGB_BackfillFunc;
  53.           return((struct Hook *)b);
  54.         }
  55.       }
  56.       FreeVec(b);
  57.     }
  58.   }
  59.   return(0);
  60. }
  61.  
  62. void RGB_FreeBackfillHook(struct Hook *Hook)
  63. {
  64.   struct RGB_BackfillHook *bf;
  65.   
  66.   bf=(struct RGB_BackfillHook *)Hook;
  67.   
  68.   if(!bf->rgb_UseCyberGfx)
  69.     ReleasePen(bf->rgb_Screen->ViewPort.ColorMap,bf->rgb_Pen);
  70.   FreeVec(bf);
  71. }
  72.  
  73. static void __saveds __asm RGB_BackfillFunc(register __a0 struct RGB_BackfillHook *BF,register __a2 struct RastPort *RP,register __a1 struct BackFillMsg *BFM)
  74. {
  75.   struct RastPort rp;
  76.  
  77.     rp = *RP;        // copy the rastport
  78.     rp.Layer = NULL; // eliminate bogus clipping from our copy
  79.  
  80.   SetAPen(&rp,BF->rgb_Pen);
  81.   RectFill(&rp,BFM->Bounds.MinX,BFM->Bounds.MinY,BFM->Bounds.MaxX,BFM->Bounds.MaxY);
  82. }
  83.  
  84. static void __saveds __asm RGB_CyberGfxBackfillFunc(register __a0 struct RGB_BackfillHook *BF,register __a2 struct RastPort *RP,register __a1 struct BackFillMsg *BFM)
  85. {
  86.   struct RastPort rp;
  87.  
  88.     rp = *RP;        // copy the rastport
  89.     rp.Layer = NULL; // eliminate bogus clipping from our copy
  90.  
  91.   FillPixelArray(&rp,BFM->Bounds.MinX,BFM->Bounds.MinY,BFM->Bounds.MaxX-BFM->Bounds.MinX+1,BFM->Bounds.MaxY-BFM->Bounds.MinY+1,BF->rgb_Pen);
  92. }
  93.  
  94.